bitkeeper revision 1.246 (3eca6a979guOx5GLVimvVvJLI_a1Ag)
authorach61@labyrinth.cl.cam.ac.uk <ach61@labyrinth.cl.cam.ac.uk>
Tue, 20 May 2003 17:49:11 +0000 (17:49 +0000)
committerach61@labyrinth.cl.cam.ac.uk <ach61@labyrinth.cl.cam.ac.uk>
Tue, 20 May 2003 17:49:11 +0000 (17:49 +0000)
additional error checking and input validation

.rootkeys
tools/control/README-xenctl [new file with mode: 0644]
tools/control/src/uk/ac/cam/cl/xeno/xenctl/Library.java
tools/control/src/uk/ac/cam/cl/xeno/xenctl/RootBean.java
tools/control/web/tmpl/dom-delr.tmpl
tools/control/web/tmpl/dom-star.tmpl
tools/control/web/tmpl/dom-stpr.tmpl
tools/control/web/tmpl/vd-par.tmpl
tools/control/web/tmpl/vd-vbdcr.tmpl
tools/control/web/tmpl/vd-vdcr.tmpl
tools/control/web/tmpl/vd-vdrr.tmpl

index de42d5d43743b8fad6b1f5d437b98d1025f1299d..351d4920afc16358b9abf03831a8a105b224136a 100644 (file)
--- a/.rootkeys
+++ b/.rootkeys
@@ -7,6 +7,7 @@
 3e6377d6eiFjF1hHIS6JEIOFk62xSA tools/balloon/README
 3e6377dbGcgnisKw16DPCaND7oGO3Q tools/balloon/balloon.c
 3eb781edFwm_pW9FwnQACIe68viLOw tools/control/Makefile
+3eca6a96a31IwaKtkEa4jmzwTWlm8Q tools/control/README-xenctl
 3eb781fcTp_LPQwaot3SSSehkaf4eg tools/control/build-dom.xml
 3ec41f7cWCxQ8pdH8ZWqhhv-38qQ1w tools/control/build-xen.xml
 3ec41f7ca6IBXDSe0HVcMPp3PPloOQ tools/control/build.properties
diff --git a/tools/control/README-xenctl b/tools/control/README-xenctl
new file mode 100644 (file)
index 0000000..379ef28
--- /dev/null
@@ -0,0 +1,45 @@
+
+some notes on configuring xenctl...
+
+to build:
+
+ # edit xeno.bk/tools/control/build.properties
+ # change manger.url to your xenoserver: mousetrap-0.xeno.cl.cam.ac.uk
+ # change build.home to your xeno.bk path
+ export PATH=/usr/groups/xeno/build_tools/bin:${PATH}
+ # this next step has already been done.
+ # cp $CATALINA_HOME/server/lib/catalina-ant.jar $ANT_HOME/lib
+ cd xeno.bk/tools/control
+ make
+ cd xeno.bk/tools/internal
+ make
+
+to setup:
+
+ ## expand the jakarta (aka catalina) tree somewhere accessible by dom0
+ export ROOTDIR=/anfs/scratch/labyrinth/ach61
+ cd $ROOTDIR
+ tar zxf /usr/groups/xeno/archive/tomcat-4.1.24.tar.gz 
+ export CATALINA_HOME=$ROOTDIR/jakarta-tomcat-4.1.24
+ export JAVA_HOME=/usr/groups/xeno/build_tools/java-1.4.1
+
+ ## edit $CATALINA_HOME/conf/server.xml, change port 8080 to port 80
+ cp $CATALINA_HOME/conf/server.xml $CATALINA_HOME/conf/server.orig
+ sed 's/8080/80/g' $CATALINA_HOME/conf/server.orig > $CATALINA_HOME/conf/server.xml 
+
+ ## install the xenctl web archive
+ cp xeno.bk/tools/control/dist/xenctl-0.1-dev.war $CATALINA_HOME/webapps/xenctl.war
+ cp xeno.bk/tools/control/domctl.xml /var/lib/xen
+
+ ## either edit xi_tools_dir in domctl.xml or copy the binaries
+ # find xeno.bk/tools/internal -perm +111 -type f -exec cp {} /usr/local/bin \;
+
+to run:
+ $CATALINA_HOME/bin/startup.sh
+ # point your browser at hostname-0.xeno.cl.cam.ac.uk:80/xenctl
+
+
+for development:
+ ## to "make install" in xeno.bk/tools/control  instead of copying the war file
+ cp $CATALINA_HOME/conf/tomcat-users.xml $CATALINA_HOME/conf/tomcat-users.orig
+ sed -e 's/<tomcat-users>/<tomcat-users>\\r  <role rolename="standard"\/>\\r  <role rolename="manager"\/>\\r  <user username="hobbes" password="tiger" roles="standard,manager"\/>/' $CATALINA_HOME/conf/tomcat-users.orig > $CATALINA_HOME/conf/tomcat-users.xml
index 0679ccaeddff95e38ea73e37f3650001e4e268da..27748b5f48b5d1bd5434ae56b87e796eea1c76d8 100644 (file)
@@ -64,6 +64,12 @@ Library
   {
     String substring = size;
     int    suffix = 1;
+    long   value = 0;
+
+    if (size == null)
+    {
+      return 0;
+    }
 
     if ((substring = check(size, 'm')) != null)
     {
@@ -94,7 +100,16 @@ Library
       substring = size;
     }
 
-    return Long.decode(substring).longValue() * suffix;
+    try
+    {
+      value = Long.decode(substring).longValue() * suffix;
+    }
+    catch (NumberFormatException e)
+    {
+      value = 0;
+    }
+
+    return value;
   }
 
   static String
index 08f388dccbe92d09b60769283106081b72fb2b2e..668f922129ea1a339f573344697843594a1d6a0f 100644 (file)
@@ -71,14 +71,19 @@ RootBean
     Partition p = pm.get_partition(partition);
     String result="done";
     int loop;
+    long size;
 
     if (p == null)
     {
       return (" eh? what partition: " + partition);
     }
 
-    vdm.add_xeno_partition(p, 
-                          Library.parse_size(chunksize)/default_sector_size);
+    size = Library.parse_size(chunksize) / default_sector_size;
+    if (size == 0)
+    {
+      return ("error: invalid chunk size");
+    }
+    vdm.add_xeno_partition(p, size);
     pm.add_xeno_partition(p);
 
     /*    return pm.dump(true); */
@@ -110,9 +115,15 @@ RootBean
   {
     VirtualDisk vd;
     Date date = new Date();
+    long parse_size;
 
-    vd = vdm.create_virtual_disk(name,
-                                Library.parse_size(size)/default_sector_size,
+
+    parse_size = Library.parse_size(size)/default_sector_size;
+    if (parse_size == 0)
+    {
+      return ("error: invalid size");
+    }
+    vd = vdm.create_virtual_disk(name, parse_size,
                                 new Date(date.getTime() + expiry));
 
     return ("Virtual Disk created with key: " + vd.get_key());
@@ -122,6 +133,11 @@ RootBean
   public String
   doDeleteVirtualDisk (String key)
   {
+    if (key == null ||
+       key.trim().equals(""))
+    {
+      return ("error: no virtual disk specified");
+    }
     vdm.delete_virtual_disk(key);
 
     return ("okay");
index 0693570f7a4af73cea8bf466ff6cf89ddce86505..04218eb72be7bd8076ce7586d495120d1d7031e9 100644 (file)
@@ -22,13 +22,22 @@ INCLUDE&dommenu.tmpl
   String domains[] = hsrw.getParameterValues("dom");
   boolean force = hsrw.getParameter("force").equals("true");
 
-  for (int i = 0; i < domains.length; i++)
+  if (domains == null || domains.length == 0)
   {
 %>
+Error: no domain specified.<br>
+<%
+  }
+  else
+  {
+    for (int i = 0; i < domains.length; i++)
+    {
+%>
 result <%= domains[i] %> =
  <%= command_destroy.executeCommand(d, Integer.parseInt(domains[i]),
                                     force) %> <br>
 <%
+    }
   }
 %>
 
index cd7e27abd46f2cd2a7b7ce8a3c0ad4f82c66b656..2c3b56ef3decab4dd7256469118b41431316de10 100644 (file)
@@ -21,13 +21,22 @@ INCLUDE&dommenu.tmpl
 
   String domains[] = hsrw.getParameterValues("dom");
 
-  for (int i = 0; i < domains.length; i++)
+  if (domains == null || domains.length == 0)
   {
 %>
-result <%= domains[i] %> =
- <%= command_start.executeCommand(d, Integer.parseInt(domains[i])) %> <br>
+Error: no domain specified.<br>
 <%
   }
+  else
+  {
+    for (int i = 0; i < domains.length; i++)
+    {
+%>
+result <%= domains[i] %> =<br>
+<%= command_start.executeCommand(d, Integer.parseInt(domains[i])) %> <br>
+<%
+    }
+  }
 %>
 
 </td>
index 8c0016e89bfad0357d680eddcaebe15fe7c18e38..a2eb6b23a615a6ae7ea5ca69e3289e22e9b32b63 100644 (file)
@@ -21,12 +21,21 @@ INCLUDE&dommenu.tmpl
 
   String domains[] = hsrw.getParameterValues("dom");
 
-  for (int i = 0; i < domains.length; i++)
+  if (domains == null || domains.length == 0)
   {
 %>
+Error: no domain specified.<br>
+<%
+  }
+  else
+  {
+    for (int i = 0; i < domains.length; i++)
+    {
+%>
 result <%= domains[i] %> =
  <%= command_stop.executeCommand(d, Integer.parseInt(domains[i])) %> <br>
 <%
+    }
   }
 %>
 
index 3a7f5ec3b9a2d2572bdf55e7f4bc44e02856bcda..b72e99b814d4bbec6f663d4fa500f95099d68b37 100644 (file)
@@ -17,22 +17,34 @@ INCLUDE&vdmenu.tmpl
   HttpServletRequestWrapper hsrw = new HttpServletRequestWrapper(request);
 
   String partitions[] = hsrw.getParameterValues("p");
-  String size = hsrw.getParameter("chunk").trim() +
-                hsrw.getParameter("chunkunits").trim();
+  String size = null;
 
-  for (int i = 0; i < partitions.length; i++)
+  if (partitions == null || partitions.length == 0)
   {
 %>
-p = <%= root.doAddPartition(partitions[i], size) %> <br>
+Error: No partitions chosen.<br>
 <%
   }
+  else if (hsrw.getParameter("chunk") == null ||
+           hsrw.getParameter("chunk").trim().equals(""))
+  {
+%>
+Error: chunk size not specified.<br>
+<%
+  }
+  else
+  {
+    size = hsrw.getParameter("chunk").trim() +
+           hsrw.getParameter("chunkunits").trim();
+    for (int i = 0; i < partitions.length; i++)
+    {
+%>
+output[<%= i %>] =<br>
+<%= root.doAddPartition(partitions[i], size) %> <br>
+<%
+    }
+  }
 %>
-chunk = <%= hsrw.getParameter("chunk") %>
-<br>
-chunkunits = <%= hsrw.getParameter("chunkunits") %>
-<br>
-size = <%= size %>
-<br>
 
 
 <%
index 78d1d74c6eb457ac5fdca1b9c6c9f9be0b537526..656be575fcc7f17efe06787d9d91f722154b17af 100644 (file)
@@ -15,20 +15,61 @@ INCLUDE&vdmenu.tmpl
 
 <%
   HttpServletRequestWrapper hsrw = new HttpServletRequestWrapper(request);
+
+  if (hsrw.getParameter("vd") == null ||
+      hsrw.getParameter("vd").trim().equals(""))
+  {
+%>
+Error: No virtual disk chosen.<br>
+<%
+  }
+  else if (hsrw.getParameter("domain") == null ||
+           hsrw.getParameter("domain").trim().equals(""))
+  {
+%>
+Error: No domain specified.<br>
+<%
+  }
+  else if (hsrw.getParameter("vbd") == null ||
+           hsrw.getParameter("vbd").trim().equals(""))
+  {
+%>
+Error: No virtual block device number specified.<br>
+<%
+  }
+  else
+  {
+    int domain = -1;
+    int vbd = -1;
+
+    try
+    {
+      domain = Integer.decode(hsrw.getParameter("domain")).intValue();
+      vbd = Integer.decode(hsrw.getParameter("vbd")).intValue();
+%>
+output =<br>
+<%= root.doCreateVirtualBlockDevice(hsrw.getParameter("vd"),
+                                    domain, vbd,
+                                     hsrw.getParameter("mode"))  %>
+<%
+    }
+    catch (NumberFormatException e)
+    {
+      if (domain == -1)
+      {
+%>
+Error: invalid domain specification.<br>
+<%
+      }
+      else
+      {
+%>
+Error: invalid virtual block device number specification.<br>
+<%
+      }
+    }
+  }
 %>
-output = <%= root.doCreateVirtualBlockDevice(hsrw.getParameter("vd"),
-                    Integer.decode(hsrw.getParameter("domain")).intValue(),
-                    Integer.decode(hsrw.getParameter("vbd")).intValue(),
-                                             hsrw.getParameter("mode"))
-         %>
-<br>
-vd = <%= hsrw.getParameter("vd") %>
-<br>
-domain = <%= hsrw.getParameter("domain") %>
-<br>
-vbd = <%= hsrw.getParameter("vbd") %>
-<br>
-mode = <%= hsrw.getParameter("mode") %>
 
 <%
   root.doFlushState();
index 85936cdd95b0163727e8f8ead7fa9d6c21696c63..08e63b2e9059e420c3707946e61d3a9f4e7c0bb7 100644 (file)
@@ -16,39 +16,64 @@ INCLUDE&vdmenu.tmpl
 
 <%
   HttpServletRequestWrapper hsrw = new HttpServletRequestWrapper(request);
-  String size = hsrw.getParameter("size").trim() +
-                hsrw.getParameter("sizeunits").trim();
-  long expiry = Long.decode(hsrw.getParameter("expiry")).longValue(); 
+  String size = null;
+  String expiry_string = null;
+  long expiry = 0;
 
-  /* not perfect, but good enough for now... */
-    if ( hsrw.getParameter("expiryunits").equals("d"))
+  if (hsrw.getParameter("size") == null ||
+      hsrw.getParameter("size").trim().equals(""))
   {
-    expiry *= 24 * 60 * 60 * 1000;
-  }
-  else if ( hsrw.getParameter("expiryunits").equals("w"))
-  {
-    expiry *= 24 * 60 * 60 * 1000 * 7;
+%>
+Error: size not specified.<br>
+<%
   }
-  else if ( hsrw.getParameter("expiryunits").equals("m"))
+  else if (hsrw.getParameter("expiry") == null ||
+           hsrw.getParameter("expiry").trim().equals(""))
   {
-    expiry *= 24 * 60 * 60 * 1000 * 30;
+%>
+Error: expiry time not specified.<br>
+<%
   }
-  else if ( hsrw.getParameter("expiryunits").equals("y"))
+  else
   {
-    expiry *= 24 * 60 * 60 * 1000 * 365;
-  }
+    size = hsrw.getParameter("size").trim() +
+           hsrw.getParameter("sizeunits").trim();
+
+    try
+    {
+      expiry = Long.decode(hsrw.getParameter("expiry")).longValue(); 
 
+      /* not perfect, but good enough for now... */
+      if ( hsrw.getParameter("expiryunits").equals("d"))
+      {
+        expiry *= 24 * 60 * 60 * 1000;
+      }
+      else if ( hsrw.getParameter("expiryunits").equals("w"))
+      {
+        expiry *= 24 * 60 * 60 * 1000 * 7;
+      }
+      else if ( hsrw.getParameter("expiryunits").equals("m"))
+      {
+        expiry *= 24 * 60 * 60 * 1000 * 30;
+      }
+      else if ( hsrw.getParameter("expiryunits").equals("y"))
+      {
+        expiry *= 24 * 60 * 60 * 1000 * 365;
+      }
 %>
-output = <%= root.doCreateVirtualDisk( hsrw.getParameter("name"),
-                                       size, expiry)
-         %>
-<br>
-size = <%= size %>
-<br>
-expiry = <%= hsrw.getParameter("expiry") %>
-<br>
-expiryunits = <%= hsrw.getParameter("expiryunits") %>
+output =<br>
+<%= root.doCreateVirtualDisk( hsrw.getParameter("name"), size, expiry) %>
 <br>
+<%
+    }
+    catch (NumberFormatException e)
+    {
+%>
+Error: invalid expiry time specification.<br>
+<%
+    }
+  }
+%>
 
 <%
   root.doFlushState();
index bf93429b26879792761e651846fb43c0a45f900f..068b2830565c3c4c3aca2e2d8d75c9694cf75614 100644 (file)
@@ -1,4 +1,4 @@
-Refresh Virtual Disk Results
+Refresh Virtual Disk
 SECTION&XenoServers
 BREADCRUMB&Virtual Disk Manager&vd.jsp
 
@@ -14,34 +14,43 @@ INCLUDE&vdmenu.tmpl
   HttpServletRequestWrapper hsrw = new HttpServletRequestWrapper(request);
 
   String vds[] = hsrw.getParameterValues("vd");
-  long expiry = Long.decode(hsrw.getParameter("expiry")).longValue(); 
+  long expiry;
 
-  /* not perfect, but good enough for now... */
-    if ( hsrw.getParameter("expiryunits").equals("d"))
-  {
-    expiry *= 24 * 60 * 60 * 1000;
-  }
-  else if ( hsrw.getParameter("expiryunits").equals("w"))
+  if (vds == null || vds.length == 0)
   {
-    expiry *= 24 * 60 * 60 * 1000 * 7;
-  }
-  else if ( hsrw.getParameter("expiryunits").equals("m"))
-  {
-    expiry *= 24 * 60 * 60 * 1000 * 30;
+%>
+Error: No virtual disk chosen.<br>
+<%
   }
-  else if ( hsrw.getParameter("expiryunits").equals("y"))
+  else if (hsrw.getParameter("expiry") == null ||
+           hsrw.getParameter("expiry").trim().equals(""))
   {
-    expiry *= 24 * 60 * 60 * 1000 * 365;
-  }
-
-  if (vds == null)
-  { 
 %>
-no virtual disks selected.
+Error: expiry time not specified.<br>
 <%
   }
   else
   {
+    expiry = Long.decode(hsrw.getParameter("expiry")).longValue(); 
+
+    /* not perfect, but good enough for now... */
+    if ( hsrw.getParameter("expiryunits").equals("d"))
+    {
+      expiry *= 24 * 60 * 60 * 1000;
+    }
+    else if ( hsrw.getParameter("expiryunits").equals("w"))
+    {
+      expiry *= 24 * 60 * 60 * 1000 * 7;
+    }
+    else if ( hsrw.getParameter("expiryunits").equals("m"))
+    {
+      expiry *= 24 * 60 * 60 * 1000 * 30;
+    }
+    else if ( hsrw.getParameter("expiryunits").equals("y"))
+    {
+      expiry *= 24 * 60 * 60 * 1000 * 365;
+    }
+
     for (int i = 0; i < vds.length; i++)
     {
 %>
@@ -51,12 +60,6 @@ vd = <%= root.doRefreshVirtualDisk(vds[i], expiry) %> <br>
   }
 %>
 
-<br>
-expiry = <%= hsrw.getParameter("expiry") %>
-<br>
-expiryunits = <%= hsrw.getParameter("expiryunits") %>
-<br>
-
 <%
   root.doFlushState();
 %>